package example_of_case.case1.entry;

import example_of_case.case1.cart.AbstractCart;
import example_of_case.case1.cart.InternalUserCart;
import example_of_case.case1.cart.NormalUserCart;
import example_of_case.case1.cart.VipUserCart;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("templatemethod")
public class TemplateMethodController {

    private static Map<Long, Integer> items = new HashMap<>();

    static {
        items.put(1L, 2);
        items.put(2L, 4);
    }

    @Autowired
    private ApplicationContext applicationContext;

    @GetMapping("wrong")
    public Cart wrong(@RequestParam("userId") int userId) {
        String userCategory = Db.getUserCategory(userId);

        if (userCategory.equals("Normal")) {
            NormalUserCart normalUserCart = new NormalUserCart();
            return normalUserCart.process(userId, items);
        }

        if (userCategory.equals("Vip")) {
            VipUserCart vipUserCart = new VipUserCart();
            return vipUserCart.process(userId, items);
        }

        if (userCategory.equals("Internal")) {
            InternalUserCart internalUserCart = new InternalUserCart();
            return internalUserCart.process(userId, items);
        }

        return null;
    }
    
    /*
     * @describition 利用工厂模式 + 模板方法模式，消除 if…else 和重复代码
     * @case 假设要开发一个购物车下单的功能，针对不同用户进行不同处理：
     *      普通用户需要收取运费，运费是商品价格的 10%，无商品折扣；
     *      VIP 用户同样需要收取商品价格 10% 的快递费，但购买两件以上相同商品时，第三件开始享受一定折扣；
     *      内部用户可以免运费，无商品折扣。
     * @param
     * @return
     */
    @GetMapping("right")
    public Cart right(@RequestParam("userId") int userId) {
        String userCategory = Db.getUserCategory(userId);
        AbstractCart cart = (AbstractCart) applicationContext.getBean(userCategory + "UserCart");  //工厂模式
        return cart.process(userId, items);  //模板方法
    }
}
